"use strict"

/**
 * 预加载图片函数
 * @param {*} images  图片数组
 * @param {*} callback 全部图片加载完调用的回调函数
 * @param {*} timeout 加载超时时长
 */
function loadImage(images,callback,timeout){
  var count = 0           // 加载完成图片的计数器
  var success = true      // 全部图片加载成功的标示位
  var timeOutId = 0       //超时timer的id
  var isTimeOut = false   // 是否加载超时标志位

  for (const key in images) {
    //过滤prototype上的属性
    if (!images.hasOwnProperty(key)) {
      continue
    }

    var item = images[key]

    if (typeof item === "string"){
      item = images[key] = {
        src:item
      }
    }
    //不符合格式的图片直接跳过
    if (!item || !item.src){
      continue
    }

    //计数+1
    count++
    //设置图片元素id
    item.id = "__img__"+key+getId()
    //设置图片元素的img,它是一个Image对象
    item.img = window[item.id] = new Image()

    doLoad(item)
  }

  //遍历完成计数为0，直接调用回调
  if (!count) {
    callback(success)
  } else if (timeout) {
    timeOutId = setTimeout(onTimeOut,timeout)
  }
  /**
   * 真正进行图片加载
   * @param {*} item 图片元素对象
   */
  function doLoad(item){
    item.status = "loading"
    var img = item.img
    //定义图片加载成功的回到函数
    img.onload = function(){
      success = success & true
      item.status = "loaded"
      done()
    }
    //定义图片加载失败回调函数
    img.onerror = function(){
      success = false
      item.status = "error"
      done()
    }

    //发起http（s）请求
    img.src = item.src

    /**
     * 每张图片加载完成的回调函数
     */
    function done(){
      img.onload = img.onerror = null

      try {
        delete window[item.id]
      }catch(e){

      }

      //每张图片加载完成，计数器-1，当所有图片加载完成且没有超时的情况下
      //清除超时定时器，且执行回调函数
      if (!--count && !isTimeOut){
        clearTimeout(timeOutId)
        callback(success)
      }
    }
  }

  /**
   * 超时函数
   */
  function onTimeOut(){
    isTimeOut = true
    callback(false)
  }
}

var __id = 0
function getId(){
  return ++__id
}
module.exports = loadImage